home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Shareware / IDimager Personal 4.2.0.3 / setup_IDimager_Personal_V4.exe / {app} / Scripts / Meta Data Scripts / Partial Replace XMP Text.psc < prev    next >
Text File  |  2008-03-25  |  7KB  |  270 lines

  1. {
  2.   This quick script can replace partial text in an existing XMP property
  3.  
  4.   The script asks for a XMP property from which parts of its text should be replaced.
  5.   Then you can difine the old and new text.
  6.  
  7.   Author: Hertwig van Zwietering
  8.   Initial Date: 2008-03-24
  9.   Last changed: 2008-03-24
  10.  
  11.   Version: 1.0
  12.   Last Changes: n.a.
  13.  
  14.   Version: 1.1
  15.   Author: Hertwig van Zwietering
  16.   Last Changes: Now also supports alternatives/sequences/bags/structures
  17. }
  18.  
  19. var
  20.   AProperty: String;
  21.   AReplaceText: WideString;
  22.   AReplaceWith: WideString;
  23.  
  24. procedure AddParamToList (AParam: TMacroParam; AList: TList);
  25. begin
  26.   AList.Add (AParam);
  27.  
  28.   if (AParam.ParamType = ptAlternative) or
  29.      (AParam.ParamType = ptBag) or
  30.      (AParam.ParamType = ptSequence)
  31.   then
  32.   begin
  33.     for i := 0 to AParam.ArrayContent.Count - 1 do
  34.       AddParamToList (AParam.ArrayContent.Items[i], AList);
  35.   end;
  36.  
  37.   if (AParam.ParamType = ptStructure) then
  38.   begin
  39.     for i := 0 to AParam.CustomParams.Count - 1 do
  40.       AddParamToList (AParam.CustomParams.Items[i], AList);
  41.   end;
  42. end;
  43.  
  44. function HandleImage (AImage: TImageItem): Boolean;
  45. var
  46.   ACatItem: TCatalogItem;
  47.   AXmp: TXMP;
  48.   AParam: TMacroParam;
  49.   AList: TList;
  50.   i: Integer;
  51.   AHit: Integer;
  52. begin
  53.   result := False;
  54.  
  55.   ACatItem := TCatalogItem.Create(nil);
  56.   if Catalog.FindImageCombined (AImage, ACatItem, False, vptNone) then
  57.   begin
  58.     AXmp := TXMP.Create (False);
  59.  
  60.     Catalog.LoadXMPForItem (ACatItem, AXmp, Options.CachedXMP);
  61.  
  62.     AParam := AXmp.XMPDesign.FindCommand (AProperty, True);
  63.     if AParam <> nil then
  64.     begin
  65.       AList := TList.Create;
  66.  
  67.       AddParamToList (AParam, AList);
  68.  
  69.       AHit := 0;
  70.       for i := 0 to AList.Count - 1 do
  71.       begin
  72.         AParam := AList.Items[i];
  73.  
  74.         if (AParam.ParamContent <> Null) and (Nvl(AParam.ParamContent, '') <> '') then
  75.         begin
  76.           // anything to replace?
  77.           if WideTextPos (AReplaceText, AParam.ParamContent) > 0 then
  78.           begin
  79.             AParam.ParamContent := StrTran (AParam.ParamContent, AReplaceText, AReplaceWith);
  80.  
  81.             Inc (AHit);
  82.           end;
  83.         end;
  84.       end;
  85.       AList.Free;
  86.  
  87.       if AHit > 0 then
  88.       begin
  89.         // store XMP again
  90.         Catalog.SaveXMPForItem (ACatItem, AXmp, Options.CachedXMP);
  91.         result := True;
  92.       end;
  93.     end;
  94.  
  95.     AXmp.Free;
  96.   end;
  97.  
  98.   ACatItem.Free;
  99. end;
  100.  
  101. procedure _OnPopupSelected (Sender: TObject);
  102. var
  103.   APopup: TXMPSelectorPopup;
  104.   AEdit: TEdit;
  105. begin
  106.   APopup  := Sender;
  107.   AEdit   := APopup.Component;
  108.  
  109.   AEdit.Text := APopup.SelectedText;
  110. end;
  111.  
  112. procedure _OnPopupClick (Sender: TObject);
  113. var
  114.   AButton: TSpeedButton;
  115.   APopup: TXMPSelectorPopup;
  116. begin
  117.   AButton := Sender;
  118.   APopup  := AButton.Tag;
  119.  
  120.   APopup.Popup (Mouse.CursorPos.X, Mouse.CursorPos.Y);
  121. end;
  122.  
  123. function AskSettings: Boolean;
  124. var
  125.   MyForm: TForm;
  126.   AProp: TEdit;
  127.   AText: TEdit;
  128.   AWith: TEdit;
  129.   AButton: TButton;
  130.   ALabel: TLabel;
  131.   APopup: TXMPSelectorPopup;
  132.   APopupButton: TSpeedButton;
  133. begin
  134.   result := False;
  135.  
  136.   AProperty     := ReadFromRegistry ('Scripts\PartialReplace', 'Property', 'photoshop:headline');
  137.   AReplaceText  := ReadFromRegistry ('Scripts\PartialReplace', 'ReplaceText', '<old text>');
  138.   AReplaceWith  := ReadFromRegistry ('Scripts\PartialReplace', 'ReplaceWith', '<new text>');
  139.  
  140.   MyForm := TForm.Create(nil);
  141.   MyForm.Position := poScreenCenter;
  142.   MyForm.BorderStyle := bsDialog;
  143.   MyForm.Height := 170;
  144.  
  145.  
  146.   ALabel := TLabel.Create(MyForm);
  147.   ALabel.Parent := MyForm;
  148.   ALabel.Caption := 'XMP property';
  149.   ALabel.Top := 13;
  150.   ALabel.Left := 5;
  151.   AProp := TEdit.Create(MyForm);
  152.   AProp.Parent := MyForm;
  153.   AProp.Text := AProperty;
  154.   AProp.Top := 10;
  155.   AProp.Left := 100;
  156.   APopup := TXMPSelectorPopup.Create (MyForm);
  157.   APopup.OnSelected := '_OnPopupSelected';
  158.   APopup.Component := AProp;
  159.   APopupButton := TSpeedButton.Create (MyForm);
  160.   APopupButton.Parent := MyForm;
  161.   APopupButton.Top    := AProp.Top;
  162.   APopupButton.Left   := AProp.Left + AProp.Width + 2;
  163.   APopupButton.Caption := '...';
  164.   APopupButton.Tag := APopup;
  165.   APopupButton.OnClick := '_OnPopupClick';
  166.   AProp.PopupMenu := APopup;
  167.  
  168.   ALabel := TLabel.Create(MyForm);
  169.   ALabel.Parent := MyForm;
  170.   ALabel.Caption := 'Text to replace';
  171.   ALabel.Top := 43;
  172.   ALabel.Left := 5;
  173.   AText := TEdit.Create(MyForm);
  174.   AText.Parent := MyForm;
  175.   AText.Text := AReplaceText;
  176.   AText.Top := 40;
  177.   AText.Left := 100;
  178.  
  179.   ALabel := TLabel.Create(MyForm);
  180.   ALabel.Parent := MyForm;
  181.   ALabel.Caption := 'Replace with';
  182.   ALabel.Top := 73;
  183.   ALabel.Left := 5;
  184.   AWith := TEdit.Create(MyForm);
  185.   AWith.Parent := MyForm;
  186.   AWith.Text := AReplaceWith;
  187.   AWith.Top := 70;
  188.   AWith.Left := 100;
  189.  
  190.  
  191.   AButton := TButton.Create(MyForm);
  192.   AButton.Parent := MyForm;
  193.   AButton.Default := True;
  194.   AButton.ModalResult := mrOk;
  195.   AButton.Caption := 'OK';
  196.   AButton.Top := MyForm.ClientHeight - 5 - AButton.Height;
  197.   AButton.Left := 5;
  198.  
  199.   AButton := TButton.Create(MyForm);
  200.   AButton.Parent := MyForm;
  201.   AButton.Default := True;
  202.   AButton.ModalResult := mrCancel;
  203.   AButton.Caption := 'Cancel';
  204.   AButton.Top := MyForm.ClientHeight - 5 - AButton.Height;
  205.   AButton.Left := 5 + AButton.Width + 5;
  206.  
  207.  
  208.   MyForm.ShowModal;
  209.  
  210.   if MyForm.ModalResult = mrOk then
  211.   begin
  212.     if (Trim(AText.Text) = '') or (Trim(AProp.Text) = '') then
  213.       Say ('No property or replace text specified.')
  214.     else
  215.     begin
  216.       AProperty := AProp.Text;
  217.       AReplaceText := AText.Text;
  218.       AReplaceWith := AWith.Text;
  219.       
  220.       WriteToRegistry ('Scripts\PartialReplace', 'Property', AProperty);
  221.       WriteToRegistry ('Scripts\PartialReplace', 'ReplaceText', AReplaceText);
  222.       WriteToRegistry ('Scripts\PartialReplace', 'ReplaceWith', AReplaceWith);
  223.  
  224.       result := True;
  225.     end;
  226.   end;
  227.  
  228.   MyForm.Free;
  229. end;
  230.  
  231. var
  232.   i: Integer;
  233.   AHit: Integer;
  234. begin
  235.   if not AskSettings then
  236.     exit;
  237.  
  238.   Progress.Cancel := False;
  239.   Progress.UseProgress;
  240.   Progress.Max := Selected.Count;
  241.   Progress.Pos := 0;
  242.   Progress.Show;
  243.  
  244.   AHit := 0;
  245.   for i := 0 to Selected.Count - 1 do
  246.   begin
  247.     Progress.Pos := i + 1;
  248.     Progress.ProgressText := Selected.Items[i].FileNameOnly;
  249.  
  250.     if HandleImage (Selected.Items[i]) then
  251.       Inc (AHit);
  252.  
  253.     if Progress.Cancel then
  254.       break;
  255.   end;
  256.  
  257.   Progress.Hide;
  258.  
  259.   if Progress.Cancel then
  260.     Say (WideFormat('Cancelled; %d handled', [AHit]))
  261.   else
  262.     SayOnce ('PartialXMPScript', WideFormat('Finished; %d handled', [AHit]), 0);
  263.  
  264.   if AHit > 0 then
  265.   begin
  266.     RefreshPanels;
  267.     InvalidateCollection;
  268.   end;
  269. end;
  270.